package com.qfedu.beans;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import java.util.Date;

/**
 * @author wangyu
 * @Classname: Student
 * @Description: TEST
 * @date 2022-04-24 15:33
 */
//@Data
//@AllArgsConstructor
//@NoArgsConstructor
//@ToString
//@Component("stu")  //类注解，声明此类被Spring容器进行管理，相当于bean标签的作用；value属性可以省略，如果省略当前类的id默认为类名首字母改小写
//@Service @Controller @Repository 这三个注解也可以将类声明给Spring管理，他们主要是语义上的区别
//@Controller  //注解主要声明将控制器配置给Spring管理，例如Servlet
//@Service     //注解主要申明业务处理类配置Spring管理，Service接口实现类
//@Repository  //注解主要声明持久化类配置给Spring管理, DAO管理
@Component  //除了控制器、Service和DAO之外的类一律使用此在胡姐声明
@Scope("singleton")  // 默认为单例模式，添加 prototype 为非单例模式，相当于bean标签的scope属性
@Lazy(true)  //用于声明一个单例模式bean是否为饿汉模式 ，true 表示为懒汉模式，默认饿汉模式

public class Student {
    private String stuNum = "1001";
    private String stuName;
    private String stuGender;
    private int stuAge;
    private Date enterenceTime;

    //    @Autowired(required = false)
    // 声明当前属性自动装配，默认 byTpe
    // 通过 required 属性设置当前自动装配是否为必须（默认是必须，如果没有找到类型与属性类型匹配的bean则抛出异常）

//    @Resource  //属性注解，也用于声明属性自动装配，默认装配方式为byName,根据byName没有将找打对应的bean,则继续根据byType
    // 寻找对应的bean,根据byType如果依然有找到bean或者找到不止一个匹配的bean，则抛出异常
    private Clazz clazz;

    @PostConstruct  // 方法注解，声明一个方法为当前类的初始化方法，在构造器之后执行，相当于bean标签的 init-method 属性
    public void init() {
        System.out.println("-------- init");
    }

    @PreDestroy // 方法注解，声明一个方法为当前类的销毁方法，在对象从容器中释放之前执行，相当于bean标签的 destory-method 属性
    public void destory() {
        System.out.println("-------- destory");
    }

    public Student() {
        System.out.println("-------- 创建");
    }

    public void setStuNum(String stuNum) {
        this.stuNum = stuNum;
    }

    public void setStuName(String stuName) {
        this.stuName = stuName;
    }

    public void setStuGender(String stuGender) {
        this.stuGender = stuGender;
    }

    public void setStuAge(int stuAge) {
        this.stuAge = stuAge;
    }

    public void setEnterenceTime(Date enterenceTime) {
        this.enterenceTime = enterenceTime;
    }


//    @Autowired()
//    public void setClazz(@Qualifier("clazz")  Clazz clazz) {
    public void setClazz(Clazz clazz) {
        this.clazz = clazz;
    }

    @Override
    public String toString() {
        return "Student{" +
                "stuNum='" + stuNum + '\'' +
                ", stuName='" + stuName + '\'' +
                ", stuGender='" + stuGender + '\'' +
                ", stuAge=" + stuAge +
                ", enterenceTime=" + enterenceTime +
                ", clazz=" + clazz +
                '}';
    }
}
